﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AgendaManager.AgendaService;

namespace AgendaManager
{
    public partial class frmNuevaObra : Form
    {
        public Obra Obra { get; set; }
        private List<ObraCaño> obraCaños = new List<ObraCaño>();
        private List<Caño> caños = new List<Caño>();

        public frmNuevaObra()
        {
            InitializeComponent();
        }

        private void btnConstructora_Click(object sender, EventArgs e)
        {
            using (frmSeleccionEmpresa f = new frmSeleccionEmpresa())
            {
                if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    Obra.EmpresaConstructora = f.Empresa.Id;
                    txConstructora.Text = f.Empresa.RazonSocial;
                }
            }
        }

        private void frmNuevaObra_Load(object sender, EventArgs e)
        {
            if (Obra == null)
            {
                Obra = new Obra();

                cbPrestador.SelectedIndex = 0;
                cbTipoObra.SelectedIndex = 0;
            }
            else
            {
                txNombre.Text = Obra.Nombre;
                
                Pais pais = ConnectHelper.ws.RetrieveEntitiesWhere(new Pais(), "Id = " + Obra.IdPais.ToString()).Cast<Pais>().ToList().FirstOrDefault();
                if (pais != null)
                    txPais.Text = pais.Nombre;

                Provincia provincia = ConnectHelper.ws.RetrieveEntitiesWhere(new Provincia(), "Id = " + Obra.IdProvincia.ToString()).Cast<Provincia>().ToList().FirstOrDefault();
                if (provincia != null)
                    txProvincia.Text = provincia.Nombre;

                txCiudad.Text = Obra.Ciudad;

                cbPrestador.SelectedText = Obra.Prestador;

                cbTipoObra.SelectedText = Obra.TipoObra;

                txNroContrato.Text = Obra.NumeroContrato;

                List<Empresa> empresasAux = ConnectHelper.ws.RetrieveEntities(new Empresa(), "").Cast<Empresa>().ToList();

                if (Obra.EmpresaConstructora != 0)
                    txConstructora.Text = empresasAux.Where(x => x.Id == Obra.EmpresaConstructora).FirstOrDefault().RazonSocial;

                if (Obra.SubContratista != 0)
                    txSubConstructora.Text = empresasAux.Where(x => x.Id == Obra.SubContratista).FirstOrDefault().RazonSocial;

                if (Obra.Comitente != 0)
                    txComitente.Text = empresasAux.Where(x => x.Id == Obra.Comitente).FirstOrDefault().RazonSocial;

                if (Obra.Inspeccion != 0)
                    txInspeccion.Text = empresasAux.Where(x => x.Id == Obra.Inspeccion).FirstOrDefault().RazonSocial;

                txInfoAdicional.Text = Obra.InformacionAdicional;

                dtInicioObra.Value = (DateTime)Obra.InicioObra;

                dtFinObra.Value = (DateTime)Obra.FinObra;

                numMonto.Value = (int)Obra.Monto;

                cbMoneda.SelectedText = Obra.Moneda;

                obraCaños = ConnectHelper.ws.RetrieveEntitiesWhere(new ObraCaño(), "IdObra = " + Obra.Id.ToString()).Cast<ObraCaño>().ToList();
                caños = ConnectHelper.ws.RetrieveEntities(new Caño(), "").Cast<Caño>().ToList();
                RefreshCaños();
            }
        }

        private void btnSubContratista_Click(object sender, EventArgs e)
        {
            using (frmSeleccionEmpresa f = new frmSeleccionEmpresa())
            {
                if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    Obra.SubContratista = f.Empresa.Id;
                    txSubConstructora.Text = f.Empresa.RazonSocial;
                }
            }
        }

        private void btnComitente_Click(object sender, EventArgs e)
        {
            using (frmSeleccionEmpresa f = new frmSeleccionEmpresa())
            {
                if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    Obra.Comitente = f.Empresa.Id;
                    txComitente.Text = f.Empresa.RazonSocial;
                }
            }
        }

        private void btnInspeccion_Click(object sender, EventArgs e)
        {
            using (frmSeleccionEmpresa f = new frmSeleccionEmpresa())
            {
                if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    Obra.Inspeccion = f.Empresa.Id;
                    txInspeccion.Text = f.Empresa.RazonSocial;
                }
            }
        }

        private void btnPais_Click(object sender, EventArgs e)
        {
            using (frmSeleccionPais f = new frmSeleccionPais())
            {
                if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    Obra.IdPais = f.Pais.Id;
                    txPais.Text = f.Pais.Nombre;
                }
            }
        }

        private void btnProvincia_Click(object sender, EventArgs e)
        {
            using (frmSeleccionProvincia f = new frmSeleccionProvincia())
            {
                if (txPais.Text == string.Empty)
                {
                    MessageBox.Show("Por favor seleccione un País antes.",
                                "Selección de Provincia.",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Exclamation);

                    return;
                }

                Pais pais = new Pais();
                pais.Id = (int)Obra.IdPais;
                pais.Nombre = txPais.Text;

                f.Pais = pais;

                if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    Obra.IdProvincia = f.Provincia.Id;
                    txProvincia.Text = f.Provincia.Nombre;
                }
            }
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            if (ValidarGuardado())
            {
                
                try
                {
                    Obra.Ciudad = txCiudad.Text != null ? txCiudad.Text : string.Empty;
                    Obra.FinObra = dtFinObra.Value.Date;
                    Obra.InformacionAdicional = txInfoAdicional.Text != null ? txInfoAdicional.Text : string.Empty;
                    Obra.InicioObra = dtInicioObra.Value.Date;
                    Obra.Moneda = cbMoneda.Text;
                    Obra.Monto = numMonto.Value;
                    Obra.Nombre = txNombre.Text;
                    Obra.NumeroContrato = txNroContrato.Text;
                    Obra.Prestador = cbPrestador.Text;
                    Obra.TipoObra = cbTipoObra.Text;

                    if (Obra.Id == 0)
                    {
                        if (NuevaObra())
                        {
                            MessageBox.Show("La Obra ha sido creada exitosamente.",
                                    "Nueva Obra.",
                                    MessageBoxButtons.OK,
                                    MessageBoxIcon.Information);
                        }
                    }
                    else
                    {
                        ActualizarObra();
                    }

                    this.DialogResult = System.Windows.Forms.DialogResult.OK;
                    this.Close();
                }
                catch (Exception)
                {
                    MessageBox.Show("No se pudo crear la Obra por favor intente nuevamente más tarde.",
                                "Nueva Obra.",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Exclamation);
                }
                
            }
        }

        private void ActualizarObra()
        {
            try
            {
                bool actualizo = ConnectHelper.ws.UpdateObra(Obra, obraCaños.ToArray());

                if (actualizo)
                {
                    MessageBox.Show("La Obra ha sido actualizada exitosamente.",
                            "Nueva Obra.",
                            MessageBoxButtons.OK,
                            MessageBoxIcon.Information);

                    this.DialogResult = System.Windows.Forms.DialogResult.OK;
                    this.Close();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        private bool NuevaObra()
        {
            try
            {
                return ConnectHelper.ws.NuevaObra(Obra, obraCaños.ToArray());
            }
            catch (Exception)
            {
                throw;
            }
        }

        private bool ValidarGuardado()
        {
            if (cbTipoObra.Text == "Prestador")
            {
                MessageBox.Show("Seleccione un Prestador por favor.",
                                "Nueva Obra.",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Exclamation);
                return false;
            }
            if (cbPrestador.Text == "Tipo de Obra")
            {
                MessageBox.Show("Seleccione un Tipo de Obra por favor.",
                                "Nueva Obra.",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Exclamation);
                return false;
            }

            return true;
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.DialogResult = System.Windows.Forms.DialogResult.Cancel;
            this.Close();
        }

        private void btAdd_Click(object sender, EventArgs e)
        {
            using (frmBusquedaCaño f = new frmBusquedaCaño())
            {
                f.esObra = true;
                f.Obra = Obra;

                if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    obraCaños.Add(f.ObraCaño);

                    RefreshCaños();
                }
            }
        }

        private void btnInformeSemanal_Click(object sender, EventArgs e)
        {
            if (Obra != null && Obra.Id != 0)
            {
                var f = FormsHelper.ShowForm<frmSeleccionCarpeta>();
                f.SetValues(Obra);
            }
            
        }

        internal void SetValues(Obra obra)
        {
            try
            {
                Obra = obra;
                txNombre.Text = Obra.Nombre;

                Pais pais = ConnectHelper.ws.RetrieveEntitiesWhere(new Pais(), "Id = " + Obra.IdPais.ToString()).Cast<Pais>().ToList().FirstOrDefault();
                if (pais != null)
                    txPais.Text = pais.Nombre;

                Provincia provincia = ConnectHelper.ws.RetrieveEntitiesWhere(new Provincia(), "Id = " + Obra.IdProvincia.ToString()).Cast<Provincia>().ToList().FirstOrDefault();
                if (provincia != null)
                    txProvincia.Text = provincia.Nombre;

                txCiudad.Text = Obra.Ciudad;

                cbPrestador.Text = Obra.Prestador;

                cbTipoObra.Text = Obra.TipoObra;

                txNroContrato.Text = Obra.NumeroContrato;

                List<Empresa> empresasAux = ConnectHelper.ws.RetrieveEntities(new Empresa(), "").Cast<Empresa>().ToList();

                if (Obra.EmpresaConstructora != null)
                    txConstructora.Text = empresasAux.Where(x => x.Id == Obra.EmpresaConstructora).FirstOrDefault().RazonSocial;

                if (Obra.SubContratista != null)
                    txSubConstructora.Text = empresasAux.Where(x => x.Id == Obra.SubContratista).FirstOrDefault().RazonSocial;

                if (Obra.Comitente != null)
                    txComitente.Text = empresasAux.Where(x => x.Id == Obra.Comitente).FirstOrDefault().RazonSocial;

                if (Obra.Inspeccion != null)
                    txInspeccion.Text = empresasAux.Where(x => x.Id == Obra.Inspeccion).FirstOrDefault().RazonSocial;

                txInfoAdicional.Text = Obra.InformacionAdicional;

                dtInicioObra.Value = (DateTime)Obra.InicioObra;

                dtFinObra.Value = (DateTime)Obra.FinObra;

                numMonto.Value = (int)Obra.Monto;

                cbMoneda.SelectedText = Obra.Moneda;

                obraCaños = ConnectHelper.ws.RetrieveEntitiesWhere(new ObraCaño(), "IdObra = " + Obra.Id.ToString()).Cast<ObraCaño>().ToList();
                caños = ConnectHelper.ws.RetrieveEntities(new Caño(), "").Cast<Caño>().ToList();
                RefreshCaños();
            }
            catch (Exception)
            {
                MessageBox.Show("Error intentando abrir la obra.",
                            "Selección de Obra.",
                            MessageBoxButtons.OK,
                            MessageBoxIcon.Error);
            }
            

        }

        private void RefreshCaños()
        {
            var gvJoinObrasCaños = from g in obraCaños
                                   join oCaños in caños
                                   on g.IdCaño equals oCaños.Id
                                   orderby oCaños.Diametro, oCaños.Presion, oCaños.Rigidez, oCaños.Longitud
                                   select new
                                   {
                                       Id = g.Id,
                                       Diametro = oCaños.Diametro,
                                       Longitud = oCaños.Longitud,
                                       Presion = oCaños.Presion,
                                       Rigidez = oCaños.Rigidez,
                                       Metros = g.Longitud
                                   };

            gvCaños.DataSource = null;
            gvCaños.DataSource = gvJoinObrasCaños.ToList();
            gvCaños.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
            gvCaños.Columns["Id"].Visible = false;
        }

        private void btRemove_Click(object sender, EventArgs e)
        {
            if (gvCaños.SelectedRows.Count == 1)
            {
                try
                {
                    int obraCañoId = Convert.ToInt32(gvCaños.SelectedRows[0].Cells["Id"].Value);

                    ObraCaño obraCaño = obraCaños.Find(x => x.Id == obraCañoId);

                    ConnectHelper.ws.DeleteEntity(obraCaño);

                    obraCaños = ConnectHelper.ws.RetrieveEntitiesWhere(new ObraCaño(), "IdObra = " + Obra.Id.ToString()).Cast<ObraCaño>().ToList();
                    caños = ConnectHelper.ws.RetrieveEntities(new Caño(), "").Cast<Caño>().ToList();
                    RefreshCaños();

                    MessageBox.Show("El caño fue eliminado correctamente.",
                            "Eliminar caño de la Obra.",
                            MessageBoxButtons.OK,
                            MessageBoxIcon.Information);
                }
                catch (Exception)
                {
                    MessageBox.Show("Error eliminando el caño.",
                            "Selección de Obra.",
                            MessageBoxButtons.OK,
                            MessageBoxIcon.Error);
                }
                
            }
        }
    }
}
